今天我們來點相對輕鬆、好理解的話題~
前幾天我們學了怎麼 git add、git commit,把檔案存進歷史紀錄。
但這時候你可能會發現一個問題:
👉 為什麼一堆奇怪的檔案也被 Git 跟著記錄了?
例如:
node_modules/ 套件模組資料夾跟著被追蹤,整個專案瞬間變得龐大。
或者更慘,.env 裡的密碼被 commit 上去了,結果敏感資訊可能外洩 😱
那種心情真的會想立刻跑路。
其實,這些災難大多可以靠一個小小的檔案預防 —— .gitignore。
.gitignore?.gitignore 是一個設定檔,用來告訴 Git:
「這些檔案或資料夾不要管它,別放進版本控制。」
就像你在打包行李的時候,會先把垃圾丟掉,不會把早餐紙袋也塞進行李箱。
Git 的使命是「幫你記錄重要的版本」,但不是所有檔案都該進歷史。
舉幾個真實例子:
node_modules/、vendor/ 👉 幾百 MB,還能隨時重裝dist/、build/ 👉 反正 build 一次就有,不需要備份.env 👉 把密碼 commit 上去就等著收警告信吧.DS_Store、Thumbs.db 👉 永遠不知道為何會出現在專案裡如果沒有過濾,專案就會變得又大又髒,甚至可能留下「黑歷史」。
在專案根目錄加一個 .gitignore 檔案,寫上規則:
# 忽略套件
node_modules/
# 忽略編譯出來的檔案
dist/
build/
# 忽略環境設定
.env
# 忽略系統垃圾
.DS_Store
Thumbs.db
之後再執行 git status,就會發現這些檔案自動消失,不會再出現在未追蹤清單裡。
.log 👉 忽略所有 .log 結尾的檔案secret/* 👉 忽略 secret 資料夾底下的所有檔案!important.log 👉 反向規則,把 important.log 加回來有時候我們想忽略整個資料夾,但裡面又有「唯一一個檔案」要保留:
logs/*
!logs/important.log
解釋:
logs/* 會先忽略掉 logs/ 底下的所有檔案!logs/important.log 再例外地把 important.log 保留下來!logs/?你可能看到有人寫:
logs/ # 忽略整個 logs 資料夾(包含內容)
!logs/ # 取消忽略資料夾本身(讓 Git 能「看見」資料夾)。
!logs/important.log # 再指定只保留 important.log
跟上面的寫法差在哪裡?
差異點:
!logs/):先忽略資料夾,再打開資料夾,讓 Git 往內比對規則。logs/*):直接忽略資料夾底下的檔案(不含資料夾本身)。⚠️ 注意:Git 本來就不會追蹤空資料夾,所以 !logs/ 實務上通常不是必須的。
只要用 logs/* 搭配 !logs/xxx.log,就能「忽略大部分檔案,只保留特定檔案」。
建議:寫法 B(logs/* + !logs/important.log)比較直觀,優先使用。
.gitignore最慘的情況就是「已經 commit 上去了」。
這時候 .gitignore 不會自動把它移掉,因為檔案已經被追蹤了。
要手動解除:
git rm -r --cached node_modules/
再 commit 一次,Git 才會真的不管它。
.gitignore,忽略掉 node_modules/。debug.log,試試看 .log 的規則能不能把它忽略掉。logs/important.log,用 logs/* + !logs/important.log 只保留它,其他檔案忽略。.gitignore 就像專案的「過濾網」,幫你把不該進歷史的東西擋在外面。
養成習慣一開始就設定好 .gitignore,不但讓專案更乾淨,也能避免不小心把敏感資料外流,否則你的 repo 可能會變成垃圾桶。
👉 明天開始,我們要進入 分支的世界,學習怎麼在不同開發線之間自由切換